package com.quectel.util.kit;

import com.quectel.util.client.minio.MinIOClient;
import lombok.Getter;

import java.io.File;
import java.io.InputStream;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * minio工具类 请使用注入方式的MinIOClient
 *
 * @author caolu
 * @email louis.cao@quectel.com
 */
@Deprecated
public class MinIOUtils {
    @Getter
    private static MinIOClient defaultClient;

    /**
     * 默认存储文件夹
     */
    private static final String COMMON = "common";

    /**
     * 无参构造方法
     */
    private MinIOUtils() {

    }

    /**
     * @param defaultClient
     */
    public static void setDefaultClient(MinIOClient defaultClient) {
        MinIOUtils.defaultClient = defaultClient;
    }


    /**
     * 该方法会返回永久外链
     *
     * @param bucketName   必须设置为public 否则外链只有7天 为空默认为public-bucket
     * @param file         要上传的文件
     * @param keepFileName 是否保持原来文件名 会覆盖文件 请慎用
     * @return 公网的地址
     */
    public static String putObjectToPublicBucketObtainUrl(String bucketName, File file, boolean keepFileName) {
        return defaultClient.putObjectToPublicBucketObtainUrl(bucketName,COMMON, file, keepFileName);
    }

    /**
     * 该方法会返回永久外链
     *
     * @param bucketName   必须设置为public 否则外链只有7天 为空默认为public-bucket
     * @param in           文件流 上传完毕会关闭流
     * @param keepFileName 是否保持原来文件名 会覆盖文件 请慎用
     * @return 公网的地址
     */
    public static String putStreamToPublicBucketObtainUrl(String bucketName, InputStream in, String fileName, boolean keepFileName) {
        return defaultClient.putStreamToPublicBucketObtainUrl(bucketName,COMMON, in, fileName, keepFileName);
    }

    /**
     * 返回文件在该bucket下的标识
     *
     * @param bucketName   bucket名称 为空默认为private-bucket
     * @param file         要上传的文件
     * @param keepFileName 是否保持原来文件名 会覆盖文件 请慎用
     * @return object将来可以下载或者获取临时外链使用
     */
    public static String putObjectToBucketObtainObject(String bucketName, File file, boolean keepFileName) {
        return defaultClient.putObjectToBucketObtainObject(bucketName,COMMON, file, keepFileName);
    }

    /**
     * 获取文件流
     *
     * @param bucketName bucket名称 为null为默认的bucket private-bucket
     * @param object     putObjectToBucket返回的结果
     * @return 一定要注意关闭
     */
    public static InputStream getObject(String bucketName, String object) {

        return defaultClient.getObject(bucketName, object);
    }

    /**
     * 获取临时url有有效期
     *
     * @param bucketName   bucket名称 为null为默认的bucket private-bucket
     * @param file         要上传的文件
     * @param keepFileName 是否保持原来文件名 会覆盖文件 请慎用
     * @return 一定要注意关闭
     */
    public static String getTemporaryUrl(String bucketName, File file, boolean keepFileName, int duration, TimeUnit unit) {
        return defaultClient.putObjectToBucketObtainTemporaryUrl(bucketName,COMMON, file, keepFileName, duration, unit);
    }


    /**
     * 根据object或者url进行删除(批量)
     *
     * @param bucketName    bucket名称 为null为默认的bucket private-bucket
     * @param objectsOrUrls 批量的object标识
     * @return 返回成功的数量
     */
    public static int deleteObjects(String bucketName, List<String> objectsOrUrls) {
        return defaultClient.deleteObjects(bucketName, objectsOrUrls);
    }

    /**
     * 创建不完全公开桶，阉割了action中的s3:ListBucket保障桶的安全性(非常推荐)
     *
     * @param bucket
     */
    public static void makeNotFullPublicBucket(String bucket) {

        defaultClient.makeNotFullPublicBucket(bucket);
    }


    /**
     * 得到桶策略
     *
     * @param bucket
     * @return
     */
    public static String getBucketPolicy(String bucket) {
        return defaultClient.getBucketPolicy(bucket);
    }

    /**
     * 查询桶是否存在
     *
     * @param bucket
     * @return
     */
    public static boolean bucketExists(String bucket) {
        return defaultClient.bucketExists(bucket);
    }

}
